package persistencia;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.UIManager;
import outros.Conexao;
import transporte.TOGrupo;
import transporte.TOSubgrupo;

public class DAOSubgrupo {
    private Conexao conexao = new Conexao();
    private Connection con = null;

    public boolean abrirConexao() {
        UIManager.put("OptionPane.yesButtonText", "Sim");
        UIManager.put("OptionPane.noButtonText", "Não");
        UIManager.put("OptionPane.cancelButtonText", "Cancelar");
        try {
            conexao.abrirConexao();
            con = conexao.getConexao();
            return true;
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Erro ao tentar conectar ao banco de dados.");
            return false;
        }
    }

    public String criar(TOSubgrupo subgrupo) {
        PreparedStatement ps = null;
        String sql = "INSERT INTO patri_subgrupo VALUES (?,?,?,?,?)";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            int id = getProximo(subgrupo.getGrupo());
            if (id!=0) {
                ps.setInt(1, id);
                ps.setString(2, subgrupo.getNome());
                ps.setInt(3, subgrupo.getGrupo());
                ps.setString(4, subgrupo.getNomeEmcidec());
                ps.setString(5, subgrupo.getCodEmcidec());
                ps.execute();
                con.commit();
                conexao.fecharConexao();
                return "";
            } else {
                conexao.fecharConexao();
                JOptionPane.showMessageDialog(null, "Erro ao tentar atribuir novo ID.");
                return "erro";
            }
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar inserir dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    public TOSubgrupo selecionarRegistro(int id, int grupo) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        sql = "SELECT * FROM patri_subgrupo WHERE numero="+id+" AND grupo="+grupo;
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            TOSubgrupo to;
            if (rs.first()) {
                to = new TOSubgrupo();
                to.setNumero(rs.getInt("numero"));
                to.setGrupo(rs.getInt("grupo"));
                to.setNome(rs.getString("nome"));
                to.setCodEmcidec(rs.getString("codemcidec"));
                to.setNomeEmcidec(rs.getString("nomeemcidec"));
                return to;
            }
            conexao.fecharConexao();
            return null;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar dados. Detalhes: "+e.toString());
            return null;
        }
    }

    public ArrayList<TOSubgrupo> selecionar(String busca) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        if (busca.length()==0) {
            sql = "SELECT * FROM patri_subgrupo ORDER BY nome ASC";
        } else {
            sql = "SELECT * FROM patri_subgrupo WHERE sem_acento(nome) ILIKE '%"+busca+"%' ORDER BY nome ASC";
        }
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            ArrayList<TOSubgrupo> al = new ArrayList();
            TOSubgrupo to = null;
            while (rs.next()) {
                to = new TOSubgrupo();
                to.setNumero(rs.getInt("numero"));
                to.setGrupo(rs.getInt("grupo"));
                to.setNome(rs.getString("nome"));
                al.add(to);
            }
            return al;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar dados. Detalhes: "+e.toString());
            return null;
        }
    }

    public String excluir(int numero, int grupo) {
        PreparedStatement ps = null;
        String sql = "DELETE FROM patri_subgrupo WHERE numero=? AND grupo=?";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            ps.setInt(1, numero);
            ps.setInt(2, grupo);
            ps.execute();
            conexao.fecharConexao();
            return "";
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar excluír dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    public String alterar(TOSubgrupo subgrupo) {
        PreparedStatement ps = null;
        String sql = "UPDATE patri_subgrupo SET nome=?, nomeemcidec=?, codemcidec=? WHERE numero=? AND grupo=?";
        try {
            abrirConexao();
            ps = con.prepareStatement(sql);
            ps.setString(1, subgrupo.getNome());
            ps.setString(2, subgrupo.getNomeEmcidec());
            ps.setString(3, subgrupo.getCodEmcidec());
            ps.setInt(4, subgrupo.getNumero());
            ps.setInt(5, subgrupo.getGrupo());
            System.out.println(ps.toString());
            ps.execute();
            conexao.fecharConexao();
            return "";
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar alterar dados. Detalhes: "+e.toString());
            return "erro";
        }
    }

    private int getProximo(int grupo){
        String sql = "SELECT MAX(numero) FROM patri_subgrupo WHERE grupo="+grupo;
        try {
            Statement st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            ResultSet rs = st.executeQuery(sql);
            if (rs.first()){
                return rs.getInt(1)+1;
            } else {
                return 0;
            }
        } catch (Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            return 0;
        }
    }

    public ArrayList<TOGrupo> getGrupos() {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        sql = "SELECT * FROM patri_grupo ORDER BY nome ASC";
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            ArrayList<TOGrupo> grupos;
            if (rs.first()) {
                grupos = new ArrayList();
                TOGrupo grupo = new TOGrupo();
                grupo.setNumero(rs.getInt("numero"));
                grupo.setNome(rs.getString("nome"));
                grupos.add(grupo);
                while (rs.next()) {
                    grupo = new TOGrupo();
                    grupo.setNumero(rs.getInt("numero"));
                    grupo.setNome(rs.getString("nome"));
                    grupos.add(grupo);
                }
                return grupos;
            }
            conexao.fecharConexao();
            return null;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar dados. Detalhes: "+e.toString());
            return null;
        }
    }

    public ArrayList<TOSubgrupo> getSubgruposPorGrupo(int grupo) {
        Statement st = null;
        ResultSet rs = null;
        String sql = "";
        sql = "SELECT * FROM patri_subgrupo WHERE grupo="+grupo+" ORDER BY nome ASC";
        try {
            abrirConexao();
            st = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
            rs = st.executeQuery(sql);
            ArrayList<TOSubgrupo> subgrupos;
            if (rs.first()) {
                subgrupos = new ArrayList();
                TOSubgrupo subgrupo = new TOSubgrupo();
                subgrupo.setNumero(rs.getInt("numero"));
                subgrupo.setGrupo(rs.getInt("grupo"));
                subgrupo.setNome(rs.getString("nome"));
                subgrupos.add(subgrupo);
                while (rs.next()) {
                    subgrupo = new TOSubgrupo();
                    subgrupo.setNumero(rs.getInt("numero"));
                    subgrupo.setGrupo(rs.getInt("grupo"));
                    subgrupo.setNome(rs.getString("nome"));
                    subgrupos.add(subgrupo);
                }
                return subgrupos;
            }
            conexao.fecharConexao();
            return null;
        } catch (Exception e) {
            conexao.fecharConexao();
            JOptionPane.showMessageDialog(null, "Erro ao tentar consultar subgrupos por grupo. Detalhes: "+e.toString());
            return null;
        }
    }
}
